package br.com.toscano.gobra.domain;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

@Entity 
@Table(name="LICITACAO")
public class Licitacao  extends ObjetoAbstrato {

	private static final long serialVersionUID = 13454534543354511L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="LICI_ID")
	private Long id;
	
	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "OBRA_ID")
	private Obra obra;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "TPLIC_ID")
	private TipoLicitacao tipoLicitacao;
	
	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "STLI_ID")
	private SituacaoLicitacao situacao;

	@Column(name="LICI_NUMERO_LICITACAO", nullable=true, length=255)
	private String numeroLicitacao;
	
	@Column(name="LICI_NUMERO_MODALIDADE", nullable=true, length=255)
	private String numeroModalidade;
	
	@Column(name="LICI_NUMERO_CONTRATO", nullable=true, length=255)
	private String numeroContrato;

	@Column(name="LICI_OBJETIVO", nullable=false, length=255)
	private String objetoLicitacao;
	
	@Column(name="LICI_DOTACAO_ORCAMENTARIA", nullable=false, length=255)
	private String dotacaoOrcamentaria;
	
//	@Column(name="LICI_CODIGO_ECONOMICO", nullable=false, length=255)
//	private String codigoEconomico;
	
	@Column(name = "LICI_DATA_ABERTURA_PROPOSTA", length = 7, nullable = true)
	private Date dataAberturaPropostas;
	
	@Column(name = "LICI_DATA_ASSINATURA_CONTRATO", length = 7, nullable = true)
	private Date dataAssinaturaContrato;
	
	@Column(name = "LICI_DATA_INICIO", length = 7, nullable = true)
	private Date dataInicio;
	
	@Column(name = "LICI_DATA_CONCLUSAO", length = 7, nullable = true)
	private Date dataConclusao;
	
	@Column(name = "LICI_VALOR_ORCAMENTO_ESTIMADO", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorOrcamentoEstimativo;

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "licitacao", orphanRemoval = true)
	@Cascade(value={org.hibernate.annotations.CascadeType.PERSIST, org.hibernate.annotations.CascadeType.MERGE})
	private List<LicitacaoEmpresa> listaLicitacaoEmpresa = new ArrayList<LicitacaoEmpresa>();

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "licitacao", orphanRemoval = true)
	@Cascade(value={org.hibernate.annotations.CascadeType.PERSIST, org.hibernate.annotations.CascadeType.MERGE})
	private List<ItemTabelaPrecoLicitacao> listaItemTabelaPrecoLicitacao = new ArrayList<ItemTabelaPrecoLicitacao>();

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Obra getObra() {
		return obra;
	}

	public void setObra(Obra obra) {
		this.obra = obra;
	}

	public TipoLicitacao getTipoLicitacao() {
		return tipoLicitacao;
	}

	public void setTipoLicitacao(TipoLicitacao tipoLicitacao) {
		this.tipoLicitacao = tipoLicitacao;
	}

	public SituacaoLicitacao getSituacao() {
		return situacao;
	}

	public void setSituacao(SituacaoLicitacao situacao) {
		this.situacao = situacao;
	}

	public String getNumeroLicitacao() {
		return numeroLicitacao;
	}

	public void setNumeroLicitacao(String numeroLicitacao) {
		this.numeroLicitacao = numeroLicitacao;
	}

	public String getNumeroModalidade() {
		return numeroModalidade;
	}

	public void setNumeroModalidade(String numeroModalidade) {
		this.numeroModalidade = numeroModalidade;
	}

	public String getNumeroContrato() {
		return numeroContrato;
	}

	public void setNumeroContrato(String numeroContrato) {
		this.numeroContrato = numeroContrato;
	}

	public String getObjetoLicitacao() {
		return objetoLicitacao;
	}

	public void setObjetoLicitacao(String objetoLicitacao) {
		this.objetoLicitacao = objetoLicitacao;
	}

	public String getDotacaoOrcamentaria() {
		return dotacaoOrcamentaria;
	}

	public void setDotacaoOrcamentaria(String dotacaoOrcamentaria) {
		this.dotacaoOrcamentaria = dotacaoOrcamentaria;
	}

//	public String getCodigoEconomico() {
//		return codigoEconomico;
//	}
//
//	public void setCodigoEconomico(String codigoEconomico) {
//		this.codigoEconomico = codigoEconomico;
//	}
//
	public Date getDataAberturaPropostas() {
		return dataAberturaPropostas;
	}

	public void setDataAberturaPropostas(Date dataAberturaPropostas) {
		this.dataAberturaPropostas = dataAberturaPropostas;
	}

	public Date getDataAssinaturaContrato() {
		return dataAssinaturaContrato;
	}

	public void setDataAssinaturaContrato(Date dataAssinaturaContrato) {
		this.dataAssinaturaContrato = dataAssinaturaContrato;
	}

	public Date getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}

	public Date getDataConclusao() {
		return dataConclusao;
	}

	public void setDataConclusao(Date dataConclusao) {
		this.dataConclusao = dataConclusao;
	}

	public BigDecimal getValorOrcamentoEstimativo() {
		return valorOrcamentoEstimativo;
	}

	public void setValorOrcamentoEstimativo(BigDecimal valorOrcamentoEstimativo) {
		this.valorOrcamentoEstimativo = valorOrcamentoEstimativo;
	}

	public List<LicitacaoEmpresa> getListaLicitacaoEmpresa() {
		return listaLicitacaoEmpresa;
	}

	public void setListaLicitacaoEmpresa(
			List<LicitacaoEmpresa> listaLicitacaoEmpresa) {
		this.listaLicitacaoEmpresa = listaLicitacaoEmpresa;
	}

	public List<ItemTabelaPrecoLicitacao> getListaItemTabelaPrecoLicitacao() {
		return listaItemTabelaPrecoLicitacao;
	}

	public void setListaItemTabelaPrecoLicitacao(
			List<ItemTabelaPrecoLicitacao> listaItemTabelaPrecoLicitacao) {
		this.listaItemTabelaPrecoLicitacao = listaItemTabelaPrecoLicitacao;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "licitacao", orphanRemoval = true)
	private List<Aditivo> listaAditivos;

	public List<Aditivo> getListaAditivos() {
		return listaAditivos;
	}

	public void setListaAditivos(List<Aditivo> listaAditivos) {
		this.listaAditivos = listaAditivos;
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if(!this.getClass().equals(obj.getClass()))
			return false;
		if (getClass() != obj.getClass())
			return false;
		Licitacao other = (Licitacao) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}